#ifndef THREAD_POOL_H
#define THREAD_POOL_H

#include <vector>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <atomic>
#include <stdexcept>

// 线程池类，用于管理多个工作线程处理任务
class ThreadPool {
public:
    // 构造函数，参数为线程池大小
    ThreadPool(size_t threads);
    
    // 析构函数，停止线程池
    ~ThreadPool();
    
    // 向线程池添加任务
    template<class F>
    void enqueue(F&& f) {
        // 如果线程池已停止,throw抛出异常
        if (stop_) {
            throw std::runtime_error("enqueue on stopped ThreadPool");
        }
        
        // 加锁添加任务,使用{}限制unique_lock作用域
        {
            std::unique_lock<std::mutex> lock(queue_mutex_);
            tasks_.emplace(std::forward<F>(f)); //emplace在容器内部直接构造元素
        }
        
        // 唤醒一个等待的工作线程
        condition_.notify_one();
    }

private:
    std::vector<std::thread> workers_;  // 工作线程集合
    std::queue<std::function<void()>> tasks_;  // 任务队列
    
    std::mutex queue_mutex_;  // 保护任务队列的互斥锁
    std::condition_variable condition_;  // 条件变量，用于线程同步
    std::atomic<bool> stop_;  // 线程池停止标志
};

#endif // THREAD_POOL_H
    